package com.baizhi.sync3;

/**
 * 互斥锁
 * 当使用多个synchronized锁定多个代码片段，并且执行的锁对象相同时，这些代码片段就是互斥的
 * 多个线程不能同时执行他们
 */
public class SyncDemo02 {
    public static void main(String[] args) {
        Foo foo = new Foo();

        /**
         * 互斥： t1在执行A方法的时候，t2既不能执行A方法也不能执行B方法
         * t1执行完A方法，t2才能开始执行B方法
         */
        Thread t1 = new Thread(()->foo.methodA());
        Thread t2 = new Thread(()->foo.methodB());

        t1.start();
        t2.start();
    }
}


class  Foo{
    public synchronized   void methodA(){
        String name = Thread.currentThread().getName();
        System.out.println(name+"正在执行A方法~~~");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(name+"执行A方法完毕！！");
    }

    public synchronized   void methodB(){
        String name = Thread.currentThread().getName();
        System.out.println(name+"正在执行B方法~~~");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(name+"执行B方法完毕！！");
    }
}
